package droidhouseclone;

import java.io.*;
import java.net.*;
import java.util.*;

/**
 *
 * @author Lorenzo Ferri
 */
public class ServerHttp implements Observer, Runnable, Server {

    private Socket s;
    private String richiesta;
    private Thread thread;
    private ServerSocket so;
    private StateObservable subject;

    public ServerHttp(StateObservable model) {

        model.addObserver(this);
        subject = model;
        thread = new Thread(this);

    }

    public void startServer() {
        //Se il thread non è attivo viene avviato
        if (!thread.isAlive()) {
            thread = new Thread(this);
            thread.start();
        }
    }

    public void stopServer() {
        try {
            //Chiudo la socket causando la chiusura del server
            if (so != null) {
                so.close();
            }
        } catch (IOException ex) {
            System.out.println("Stop ServerHTTP");
        }
    }

    public void run() {
        try {
            System.out.println("Server HTTP is Started");
            while (true) {

                //Socket che resta in ascolto della ricezione di pacchetti sulla rete
                so = new ServerSocket(80);

                //Accetta la connessione alla socket
                s = so.accept();

                System.out.println("Server HTTP: ricevuta richiesta");

                // ottengo lo stream di Input dalla socket
                BufferedReader ois = new BufferedReader(new InputStreamReader(s.getInputStream()));

                // leggo la richiesta
                richiesta = ois.readLine();

                //Controllo se la richiesta è di tipo GET
                if (richiesta.startsWith("GET")) {

                    if (richiesta.contains("vol=p")) {
                        //Stampo il tipo di richiesta ed incremento il volume
                        System.out.println("volume +1");
                        subject.increaseVolume(1);


                    } else if (richiesta.contains("vol=m")) {
                        //Stampo il tipo di richiesta ed decremento il volume
                        System.out.println("volume -1");
                        subject.decreaseVolume(1);


                    } else if (richiesta.contains("port=")) {
                        //Scompongo l'informazione fino a trovare il valore della porta
                        //notifico al subject il nuovo valore di porta
                        String[] port = richiesta.split("=");
                        String porta = port[1].replace("HTTP/1.1", "");
                        System.out.println(porta);
                        subject.setPort(Integer.parseInt(porta.trim()));

                    } else if (richiesta.contains("during=")) {
                        //Scompongo l'informazione fino a trovare il valore della durata
                        //notifico al subject il nuovo valore della durata
                        String[] dura = richiesta.split("=");
                        String duration = dura[1].replace("HTTP/1.1", "");
                        System.out.println(duration);
                        subject.setDuration(Integer.parseInt(duration.trim()));

                    } else if (richiesta.contains("name=")) {
                        //Scompongo l'informazione fino a trovare il titolo della canzone
                        //notifico al subject il titolo della canzone
                        String[] nome = richiesta.split("=");
                        String name = nome[1].replace("HTTP/1.1", "");
                        System.out.println(name);
                        subject.setName(name);

                    }

                }

                //chiudo le socket.
                s.close();
                so.close();
            }
        } catch (BindException e) {
            //notifico al subject del errore che produrrà la sospensione del programma
            subject.setStateServer(8);
        } catch (IOException e) {
            System.out.println("Server HTTP Close");
        }
    }

    public void update(Observable o, Object arg) {

        StateObservable model = (StateObservable) o;
        //Controllo lo stato attuale del subject
        switch (model.getState()) {

            case 1:
                //Avvio il server
                startServer();
                break;
            case 2:
                //Chiudo il server
                stopServer();
                break;
            default:
                break;

        }

    }
}
